package com.duke.javaagent.bytebuddy01.interceptor;

import net.bytebuddy.implementation.bind.annotation.*;

import java.lang.reflect.Method;
import java.util.concurrent.Callable;

/**
 * @author gjy
 * @create 2024-12-10 10:46 AM
 */
public class SpringMVCInterceptor {
    @RuntimeType
    public Object intercept(
            //表示被拦截的目标对象，只有拦截实例方法或构造方法时可用
            @This Object obj,
                                    // 表示被拦截的目标方法 .只有拦截实例方法或构造方法时可用
                                   @Origin Method targetMethod,
                                   //表示被拦截的目标方法参数，只有拦截实例方法或构造方法时可用
                                   @Argument(0) String orderNumber,
                                   //用于调用目标方法（原始的方法）
                                   @SuperCall Callable<?> zuperCall) {
        System.out.println("ByteBuddy增强逻辑  controller方法 before，方法名称： "+targetMethod+"打印输出当前订单号: orderNumber = " + orderNumber);
        long startTime = System.currentTimeMillis();
        Object call = null;
        try {
            //调用目标方法
            call = zuperCall.call();
            System.out.println("ByteBuddy增强逻辑  controller方法 after,执行结果： "+call);
        } catch (Exception e) {
            System.out.println("异常了，异常信息" + e);
        }finally {
            long endTime = System.currentTimeMillis();
            System.out.println("方法执行时间：" + (endTime - startTime) + "ms");
        }
        return call;
    }
}
